package fnsvr

import "sync"

type IPoolObj interface {
	Reset()
}

// ool 是一个泛型对象池，基于 sync.Pool 实现
type Pool[T IPoolObj] struct {
	pool sync.Pool
}

// NewPool 创建一个新的泛型对象池
// newFunc: 用于创建新对象的函数（当池为空时自动调用）
func NewPool[T IPoolObj](newFunc func() T) *Pool[T] {
	return &Pool[T]{
		pool: sync.Pool{
			New: func() interface{} { return newFunc() },
		},
	}
}

// Get 从池中获取一个对象
func (p *Pool[T]) Get() T {
	return p.pool.Get().(T)
}

// Put 将对象放回池中
func (p *Pool[T]) Put(x T) {
	x.Reset()
	p.pool.Put(x)
}
